#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_image.h>
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <iostream>
#include <sys/time.h>
#include "config_serv.h"
#include <time.h>

using namespace std;

#define MAXQ 5
#define TAMBUF 26
#define TAM0 16
#define TAM1 35
#define TAM2 25
#define TAM3 20
#define TAM12 12
#define MAXCLI 10

#define TORNEO_UP 5

typedef struct{
	int  id,socket,
		 puntaje,
		 disponible,
		 cantPartidas,
		 conectado,
		 posicionEnTorneo; //1 conectado puntaje dentro del torneo
	char nombre[10];

}t_jugador;

typedef struct{
	int  pid,
	     jugador1,
	     jugador2,
	     terminoPartida,
	     jugadorGanador; //ganador (1 o 2)
}t_partida;

typedef struct{
	t_jugador jugador[MAXCLI];
	int cantPartidas;
	t_partida partidas[50];
	int cantJugadores;
	int t_chequeo;
	int tiempo_torneo;
	int tiempo_espera_conex_max;
	int nivel_dificultad;
	int cantidad_rescates;
	//int flagFinConexiones;
	int partidaCaida; //1 se cayo la partida
}t_torneo;

typedef struct {
	char tipo_senial[5]; //mov
	char identificador[6]; //jug1
	char senial[5];//izq
	char x[5];
	char y[5];
}envio;

void inicializarPosiciones();
void armarPartidas(int);
void configurarServer();
void crearSemaforos();
void crearThreads();
void esperarThreadDibuja();
void esperarThreadEscucha();
void capturarSeniales();
void crearMemoriaCompartida(key_t);
void liberarRecursos();
void inicializarDatos();
void inicializarSDL();
void handler_signal(int);
void handler_sigchld(int, siginfo_t *, void *);
void *escucharConexiones(void*);
void *dibujarPantalla(void*);
void *monitorearServidor(void *arg);
void *monitorTeclas(void *arg);
void *controlarTiempo(void *);
void cargarPresentacion();
void cargaTitulos(int);
void recargarPantalla();
int getFin();
void administrarPartidas();
void generarPartidas();
void lanzarPartidas(int, int, int);
void reLanzarPartidas(int, int, int);
void esperarPartidas();
void capturarSeniales();
void handler_signal(int );
void handler_sigchld(int , siginfo_t *, void *);
void mostrarPartidasArmadas();
void mostrarResultadoFinalDeTorneo();
void aceptarJugador(int conSocket);
void cargarPresentacionPartidas();
void imprimirEnPantalla(const char *valor,int x, int y,SDL_Color color,TTF_Font *fuente);
void informarResultadoAClientes();
void mensajeAJugador(const char* msj, int conSocket);
void pantallaPresentacion();
void cargarPresentacionTorneoFinalizado();
void imprimirEnPantalla2(const char *valor,int x, int y,SDL_Color color,TTF_Font *fuente);
void envioNombreJugadoresACliente(int socket1,int socket2,const char *jugador1,const char *jugador2);

// maxi
void ejecutarMonitor();
void reEjecutarMonitor();
void *monitorizarMonitor(void *);
int verificar_proceso_monitor(void);
